package com.atguigu.Threads.Exer;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 银行有一个账户，有两个储户分别向同一个账户存3000元，每次存1000，存三次，每次存完打印账户余额，实现两个储户交换存取
 * 问题：该程序是否有线程安全问题，如果有，怎么解决
 * 1.储户之间存在共同操作的数据（账户的余额）,需要同步机制保持余额的正确
 * @author xiaoqi
 * @data 2021/04/06 23:23
 */

//创建一个Account类型的数据类型，有成员变量account表示记录余额，成员方法SaveIntoaccount(int money)存钱
class Account{
    private double money;

    //成员方法

    /**
     *
     * @param money 代表存取的金额
     */
//    public synchronized void SavaIntoAccount(double money){
    public void SavaIntoAccount(double money){
        if(money > 0) {
            this.money += money;
            System.out.println(Thread.currentThread().getName() + "存钱成功，当前账户余额为" + this.money);
        }
    }
}
//创建储户类，代表储户
class Customer extends Thread{
    private Account account;
    private static ReentrantLock lock = new ReentrantLock();

    //构造器

    public Customer(Account account) {
        this.account = account;
    }

    @Override
    public void run() {

        for (int i = 0; i < 3; i++) {
            try {
                lock.lock();
                this.account.SavaIntoAccount(1000);
            }
            finally {
                lock.unlock();
            }
        }
    }
}
public class SavaMoney {
    public static void main(String[] args) {
        //建立一个银行账户
        Account account = new Account();
        //创建两个储户
        Customer c1 = new Customer(account);
        Customer c2 = new Customer(account);
        //更改储户名字
        c1.setName("储户甲");
        c2.setName("储户乙");
        c1.start();
        c2.start();
    }
}
